// JWT工具函数

/**
 * 解析JWT token
 * @param {string} token - JWT token字符串
 * @returns {object|null} 解析后的token数据或null（如果解析失败）
 */
export const parseJwt = (token) => {
  try {
    if (!token) return null;
    
    // 将token分割为三部分：header.payload.signature
    const base64Url = token.split('.')[1];
    if (!base64Url) return null;
    
    // 处理base64编码（替换URL安全字符并填充）
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
    const padding = base64.length % 4 === 0 ? '' : '='.repeat(4 - (base64.length % 4));
    const payload = decodeURIComponent(
      atob(base64 + padding)
        .split('')
        .map((c) => `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`)
        .join('')
    );
    
    return JSON.parse(payload);
  } catch (error) {
    console.error('解析JWT失败:', error);
    return null;
  }
};

/**
 * 检查token是否过期
 * @param {string} token - JWT token字符串
 * @returns {boolean} token是否已过期
 */
export const isTokenExpired = (token) => {
  try {
    const decoded = parseJwt(token);
    if (!decoded || !decoded.exp) return true;
    
    // 检查token是否在过期前5分钟内（预留刷新时间）
    const currentTime = Math.floor(Date.now() / 1000);
    const fiveMinutesInSeconds = 5 * 60;
    return decoded.exp - currentTime < fiveMinutesInSeconds;
  } catch (error) {
    console.error('检查token过期状态失败:', error);
    return true;
  }
};

/**
 * 从localStorage获取token
 * @returns {string|null} token字符串或null
 */
export const getToken = () => {
  try {
    return localStorage.getItem('token');
  } catch (error) {
    console.error('获取token失败:', error);
    return null;
  }
};

/**
 * 保存token到localStorage
 * @param {string} token - JWT token字符串
 */
export const setToken = (token) => {
  try {
    localStorage.setItem('token', token);
  } catch (error) {
    console.error('保存token失败:', error);
  }
};

/**
 * 从localStorage移除token
 */
export const removeToken = () => {
  try {
    localStorage.removeItem('token');
  } catch (error) {
    console.error('移除token失败:', error);
  }
};

/**
 * 从localStorage获取用户信息
 * @returns {object|null} 用户信息对象或null
 */
export const getUserInfo = () => {
  try {
    const user = localStorage.getItem('user');
    // 确保user是字符串且不是'undefined'或'null'
    if (!user || user === 'undefined' || user === 'null') {
      return null;
    }
    return JSON.parse(user);
  } catch (error) {
    console.error('获取用户信息失败:', error);
    return null;
  }
};

/**
 * 保存用户信息到localStorage
 * @param {object} userInfo - 用户信息对象
 */
export const setUserInfo = (userInfo) => {
  try {
    localStorage.setItem('user', JSON.stringify(userInfo));
  } catch (error) {
    console.error('保存用户信息失败:', error);
  }
};

/**
 * 从localStorage移除用户信息
 */
export const removeUserInfo = () => {
  try {
    localStorage.removeItem('user');
  } catch (error) {
    console.error('移除用户信息失败:', error);
  }
};

/**
 * 清除所有认证相关数据
 */
export const clearAuthData = () => {
  removeToken();
  removeUserInfo();
};

/**
 * 验证token是否有效
 * @param {string} token - JWT token字符串
 * @returns {boolean} token是否有效
 */
export const isValidToken = (token) => {
  // 基本验证
  if (!token) return false;
  
  // 检查token格式是否正确（应该包含两个点）
  if (token.split('.').length !== 3) return false;
  
  // 检查是否过期
  if (isTokenExpired(token)) return false;
  
  return true;
};

/**
 * 获取token中的用户角色
 * @param {string} token - JWT token字符串
 * @returns {string|array|null} 用户角色或null
 */
export const getUserRoles = (token) => {
  const decoded = parseJwt(token);
  if (!decoded) return null;
  
  // 通常JWT中的角色信息可能在不同的字段中
  return decoded.role || decoded.roles || decoded['http://schemas.microsoft.com/ws/2008/06/identity/claims/role'] || null;
};

/**
 * 检查用户是否有指定角色
 * @param {string} token - JWT token字符串
 * @param {string|array} requiredRoles - 所需角色
 * @returns {boolean} 用户是否有指定角色
 */
export const hasRole = (token, requiredRoles) => {
  const userRoles = getUserRoles(token);
  if (!userRoles) return false;
  
  if (typeof requiredRoles === 'string') {
    requiredRoles = [requiredRoles];
  }
  
  if (Array.isArray(userRoles)) {
    return requiredRoles.some(role => userRoles.includes(role));
  } else {
    return requiredRoles.includes(userRoles);
  }
};

/**
 * 获取token中的用户ID
 * @param {string} token - JWT token字符串
 * @returns {string|number|null} 用户ID或null
 */
export const getUserId = (token) => {
  const decoded = parseJwt(token);
  if (!decoded) return null;
  
  // 通常JWT中的用户ID可能在不同的字段中
  return decoded.sub || decoded.id || decoded.userId || null;
};